using System;
using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace WpfApp_ChenxiConsole.TCP
{
    /// <summary>
    /// 消息过滤器，用于过滤和分发TCP消息
    /// </summary>
    public class MessageFilter
    {
        // 存储所有注册的消息处理器
        private static readonly Dictionary<string, Action<string>> MessageHandlers = new();
        
        /// <summary>
        /// 过滤消息并分发给相应的处理器
        /// </summary>
        /// <param name="message">要过滤的消息</param>
        public static void FilterMessage(string message)
        {
            try
            {
                // 尝试解析JSON消息
                if (IsJsonMessage(message))
                {
                    // 解析消息以检查是否包含cmd字段为996
                    using var jsonDoc = JsonDocument.Parse(message);
                    if (jsonDoc.RootElement.TryGetProperty("cmd", out var cmdProperty) && 
                        cmdProperty.ValueKind == JsonValueKind.Number && 
                        cmdProperty.GetInt32() == 996)
                    {
                        // 消息匹配条件，调用已注册的处理器
                        foreach (var handler in MessageHandlers.Values)
                        {
                            handler?.Invoke(message);
                        }
                    }
                }
            }
            catch (Exception)
            {
                // 忽略JSON解析错误，不是有效的JSON消息
            }
        }
        
        /// <summary>
        /// 检查字符串是否为有效的JSON格式
        /// </summary>
        /// <param name="message">要检查的消息</param>
        /// <returns>是否为有效的JSON格式</returns>
        private static bool IsJsonMessage(string message)
        {
            if (string.IsNullOrWhiteSpace(message)) return false;
            message = message.Trim();
            return (message.StartsWith('{') && message.EndsWith('}')) || 
                   (message.StartsWith('[') && message.EndsWith(']'));
        }
        
        /// <summary>
        /// 注册消息处理器
        /// </summary>
        /// <param name="handlerId">处理器ID</param>
        /// <param name="handler">消息处理函数</param>
        public static void RegisterHandler(string handlerId, Action<string> handler)
        {
            if (!MessageHandlers.ContainsKey(handlerId))
            {
                MessageHandlers.Add(handlerId, handler);
            }
            else
            {
                MessageHandlers[handlerId] = handler;
            }
        }
        
        /// <summary>
        /// 注销消息处理器
        /// </summary>
        /// <param name="handlerId">处理器ID</param>
        public static void UnregisterHandler(string handlerId)
        {
            if (MessageHandlers.ContainsKey(handlerId))
            {
                MessageHandlers.Remove(handlerId);
            }
        }
    }
}